#pragma once

#include <cassert>

namespace roy {
    
    namespace math {

        // zero
        template <typename T> inline T zero(void) { assert(false); return zero<T>(); }
        template <> inline int zero<int>(void) { return 0; }
        template <> inline float zero<float>(void) { return 0.0f; }
        template <> inline double zero<double>(void) { return 0.0; }

        // one
        template <typename T> inline T one(void) { assert(false); return zero<T>(); }
        template <> inline int one<int>(void) { return 1; }
        template <> inline float one<float>(void) { return 1.0f; }
        template <> inline double one<double>(void) { return 1.0; }

        // eps
        template <typename T> inline T eps(void) { assert(false); return zero<T>(); }
        template <> inline int eps<int>(void) { return 0; }
        template <> inline float eps<float>(void) { return 1e-5f; }
        template <> inline double eps<double>(void) { return 1e-9; }

        // inf
        template <typename T> inline T inf(void) { assert(false); return zero<T>(); }
        template <> inline int inf<int>(void) { return 2000000000; }
        template <> inline float inf<float>(void) { return 1e5f; }
        template <> inline double inf<double>(void) { return 1e9; }

        // pi
        template <typename T> inline T pi(void) { assert(false); return zero<T>(); }
        template <> inline float pi<float>(void) { return 3.1415926f; }
        template <> inline double pi<double>(void) { return 3.1415926535897932384626; }

    }

}

